#ifndef FTPCLIENT_H
#define FTPCLIENT_H

#include <QObject>
#include <curl.h>
#include <QMutex>
#include "ftpdatamodel.h"
// 模板的声明
template <typename T> class QFuture;
class FtpClient : public QObject
{
    Q_OBJECT
public:
    explicit FtpClient(QObject *parent = nullptr);
    ~ FtpClient();

    // 上传文件
    QFuture<bool> uploadFileAsync(const QString& ftpUrl, const QString& username,
        const QString& password, const QString& localFile,
        const QString& remoteFile);

    // 获取远程目录列表
    QFuture<QList<Ftp::FileInfo>> getDirectoryListingAsync(
        const QString& ftpUrl, const QString& username,
        const QString& password, const QString& remoteDir);

    // 核心功能：下载单个文件（返回 QFuture<bool> 用于异步）
    QFuture<bool> downloadFileAsync(
        const QString& ftpUrl,    // 如 "ftp://your.server.com"
        const QString& username,  // FTP 用户名
        const QString& password,  // FTP 密码
        const QString& remoteFile,// 远程文件路径（如 "/test.txt"）
        const QString& localFile  // 本地保存路径（如 "C:/downloads/test.txt"
    );
signals:
    // 下载进度反馈（文件名 + 进度0~100）
    void downloadProgress(const QString& fileName, int progress);
    // 新增：上传进度信号
    void uploadProgress(const QString& fileName, int progress);
    void uploadFinished(const QString& fileName, bool success);
    void uploadError(const QString& fileName, const QString& errorMessage);
    // 文件列表响应信号
    void directoryListingReady(const QList<Ftp::FileInfo>& fileList);
    void directoryListingError(const QString& error);
private:
    bool m_initialized;
    int m_lastProgress;

    QAtomicInt m_operationInProgress; // 0无操作，1:下载，2:上传, 3.获取文件列表
    CURL* createCurlHandle();
    QString cleanRemotePath(const QString& path);
    static size_t uploadWriteCallback(void* contents, size_t size, size_t nmemb, void* userp);
    static int uploadProgressCallback(void* clientp, double dltotal, double dlnow,
        double ultotal, double ulnow);
    static size_t listCallback(void* contents, size_t size, size_t nmemb, void* userp);

    QString responseData;  // 存储FTP服务器响应数据
    QMutex mutex;
    bool curlInitialized;
    // 写文件
    static size_t writeCallback(void* contents, size_t size, size_t nmemb, void* userp);
    static int progressCallback(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow);
};

#endif // FTPCLIENT_H
